package com.magelink.pojo;

import java.io.Serializable;
import java.math.BigDecimal;

import com.magelink.domain.ActivityEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;


/**
 * 商品实例通知
 *
 * @author 梁卓
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class IsvInstance implements Serializable {
    /**     版本控制
     * 　　 serialVersionUID作用是序列化时保持版本的兼容性，即在版本升级时反序列化仍保持对象的唯一性
     *     序列化时为了保持版本的兼容性，即在版本升级时反序列化仍保持对象的唯一性
     */
    private static final long serialVersionUID = 1L;
    /**
     * 　　 * 实例ID(新购场景无实例ID,其余场景必须要有)
     */
    private String instanceId;
    /**
     * 安全校验令牌
     */

    private String authToken;
    /**
     * 请求发起时的时间戳，取UTC时间。格式：yyyyMMddHHmmssSSS
     */
    private String timeStamp;
    /**
     * 接口请求标识，用于区分接口请求场景
     */
    private ActivityEnum activity;
    /**
     * 客户在华为云注册账号的唯一标识
     */
    private String customerId;
    /**
     * 客户在华为云注册的账户名
     */
    private String customerName;
    /**
     * 客户以IAM用户认证方式登录时对应子用户的唯一标识。
     * 非必传，如需此参数，在商品发布时“需要用户授权”请选择“基于IAM用户名创建应用管理账号等信息”。
     */
    private String userId;
    /**
     * 客户以IAM用户认证方式登录的用户名。
     * 非必传，如需此参数，在商品发布时“需要用户授权”请选择“基于IAM用户名创建应用管理账号等信息”。
     */
    private String userName;
    /**
     * 客户手机号,不包含国家码。
     * 非必传，如需此参数，在商品发布时“需要用户授权”请选择“基于手机号码创建应用管理账号等信息”，取值为加密后的手机号码。
     * 手机号加密规则如下：
     * 由16位iv加密向量和base编码后的手机号密文组成。
     * iv+base64(AES_CBC(accessKey,mobilePhone))
     * 加密位数取ISV发布产品时选择的加密位数。
     */
    private String mobilePhone;
    /**
     * 客户邮箱。
     * 非必传，如需此参数，在商品发布时“需要用户授权”请选择“基于邮箱创建应用管理账号等信息”，取值为加密后的邮箱。
     * 邮箱加密规则如下：
     * 由16位iv加密向量和base编码后的邮箱密文组成。
     * iv+base64(AES_CBC(accessKey,email))
     * 加密位数取ISV发布产品时选择的加密位数。
     */
    private String email;
    /**
     * 云市场业务ID。
     * 每一次请求，businessId皆不一致。
     */
    private String businessId;
    /**
     * 云市场订单ID。
     */
    private String orderId;
    /**
     * 产品规格标识。租户购买包月或包年的产品后，可能会续费，续费支持变更周期类型（例如包月转包年），
     * 此时，租户开通的实例instanceId对应的productId会变化，但skuCode不变。
     * 该参数可在商品审核上架后，进入“卖家中心 > 商品管理 > 我的商品 ”页面，单击该商品操作列的“详情”进入商品详情页面获取
     */
    private String skuCode;
    /**
     *
     * 产品标识，同一skuCode下，不同周期类型的productId不同。
     * 例如：ISV发布产品，新增一个规格，会生成一个skuCode，再配置包年价格，包月价格，会生成两个productId。
     * 该参数可在商品审核上架后，进入“卖家中心 > 商品管理 > 我的商品 ”页面，单击该商品操作列的“详情”进入商品详情页面获取。
     */
    private String productId;
    /**
     * 是否为调试请求。
     * 1：调试请求
     * 0：非调试请求
     * 取值为“0”时默认不传。
     */
    private String testFlag;
    /**
     * 是否是开通试用实例。
     * 1：试用实例
     * 0：非试用实例
     * 不传试用参数：2018年5月12日之前已发布成功的产品实例
     * 取值为“0”时默认不传。
     */
    private String trialFlag;
    /**
     * 过期时间。
     * 格式：yyyyMMddHHmmss
     * 按周期售卖的商品，会请求该参数。
     * 按次售卖的商品，不会请求该参数。
     * 过期时间根据订单创建时间和购买周期计算而来，与订单实际过期时间有误差，仅供参考。
     */
    private String expireTime;
    /**
     * 计费模式。
     * 3：表示按次购买。
     * 说明：
     * 包周期购买场景请求时不传该参数。
     * 按次购买场景请求时传该参数。
     */
    private Integer chargingMode;
    /**
     * 扩展参数。非必填。
     * 扩展参数格式为json数组字符串通过 urlEncode(base64(saasExtendParams))携带到url参数中。在得到saasExtendParams参数的值后，需要通过base64Decode(urlDecode(saasExtendParams))获取扩展参数json数组。
     * 例如：[{"name":"emailDomainName","value":"test.xxxx.com"},{"name":"extendParamName","value":"extendParamValue"}]
     * 其中emailDomainName和extendParamName为发布商品时填写值。
     * 说明：
     * （本说明仅适用于WeLink开放平台开发的商品）
     * 请先在应用接入调试页面调测“WeLink商品接口调测必选参数”，发布WeLink开放平台开发的商品时，会包含name值为platformParams的扩展参数，值为json格式字符串，包含tenantName、tennantId、userId三个参数。
     * tenantName是WeLink中的企业名
     * tennantId是WeLink中的企业唯一标识符
     * userId是WeLink中订阅该应用的用户，通常为企业管理员（WeLink企业管理员可以有多个且企业管理员账号可被注销）
     */
    private String saasExtendParams;
    /**
     * 数量类型的商品定价属性。非必填。
     * 属性名称：数量（支持服务商自定义名称）
     * 单位：个（次）
     * 说明：
     * 对于包周期或一次性计费的SaaS商品，租户下单购买包含“数量”线性属性的规格时，会填写及调整购买的个数或次数。
     * 例如：30个用户
     */
    private Integer amount;
    /**
     * 数量类型的商品定价属性。非必填。
     * 属性名称：硬盘大小（支持服务商自定义名称）
     * 单位：GB
     * 说明：
     * 对于包周期或一次性计费的SaaS商品，租户下单购买包含“硬盘大小”线性属性的规格时，会填写及调整购买多少GB。
     * 例如：100GB
     */
    private Integer diskSize;
    /**
     * 数量类型的商品定价属性。非必填。
     * 属性名称：带宽（支持服务商自定义名称）
     * 单位：Mbps
     * 说明：
     * 对于包周期或一次性计费的SaaS商品，租户下单购买包含“带宽”线性属性的规格时，会填写及调整购买多少Mbps。
     * 例如：20Mbps
     */
    private Integer bandWidth;
    /**
     * 周期类型。
     * 说明：
     * 非必传，如需此参数，计费类型需选择包周期chargingMode=1，包周期购买场景请求时传该参数。
     * 年："year"
     * 月："month"
     */
    private String periodType;
    /**
     * 周期数量。
     * 说明：
     * 非必传，如需此参数，计费类型需选择包周期chargingMode=1，包周期购买场景请求时传该参数。
     * 周期数量：1,2,3…
     */
    private Integer periodNumber;
    /**
     * 订单金额。
     * 说明：
     * 该金额为用户实际支付金额，供服务商对账参考。
     * 金额值大于等于0，最大三位小数。
     * 单位：元
     */
    private BigDecimal orderAmount;
    /**
     * 商品实例开通方式。
     * 说明：
     * 用户购买后同步开通（默认，云市场轮询调用newInstance生产接口）
     * 用户确认验收后开通（SaaS涉及服务监管）
     * 用户购买该商品时，云市场调用新购商品接口，服务商需返回结果码为请求处理中000004或订单创建成功000000。
     * 当服务商点击开通交付时，云市场调用新购商品接口，服务商需返回结果码成功000000。
     * 用户点击确认验收时，云市场调用新购商品传入用户验收时间给到服务商，服务商需返回结果码成功000000。
     * ISV接口通知云市场开通（暂未使用）
     */
    private Integer provisionType;
    /**
     * 用户验收时间。
     * 说明：
     * 此时间为用户计费开始时间，如选择的商品实例开通方式为“用户确认验收后开通”，则用户验收时间为必填项。
     * 格式：yyyyMMddHHmmssSSS
     */
    private String acceptanceTime;
}
